package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

// 方式一：
// func main() {
// 	http.HandleFunc("/", func (w http.ResponseWriter, r *http.Request) {
// 		fmt.Fprintf(w, "Hello, %s!", r.FormValue("name"))
// 	})
// 	http.ListenAndServe(":8080", nil)
// }

// 方式二：
// func main() {
// 	http.HandleFunc("/native", sayHello)
// 	http.ListenAndServe(":8080", nil)
// }

// func sayHello (w http.ResponseWriter, r *http.Request) {
// 	fmt.Fprintf(w, "Hello, %s!", r.FormValue("name"))
// }

// 方式三：
// func main() {
// 	s := &http.Server{
// 		Addr:    ":8080",
// 		Handler: http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) {
// 			fmt.Fprintf(w, "你好, %s!", r.FormValue("name"))
// 		}),
// 	}
// 	s.ListenAndServe()
// }

// 方式四：(接受POST请求)
func main() {
	s := &http.Server{
		Addr:    ":8080",
		Handler: http.HandlerFunc(sayHello),
	}
	s.ListenAndServe()
}

func sayHello (w http.ResponseWriter, r *http.Request) {
	fmt.Println(r.Method)
	b, err := ioutil.ReadAll(r.Body)
	if err != nil {
		fmt.Printf("read request.Body failed, err:%v\n", err)
		return
	}
	fmt.Println(string(b))
	
	p := &struct{Name string `json:"name"`}{}
	json.Unmarshal(b, p)
	fmt.Fprintf(w, "Hello, %s!", p.Name)
}